/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ec.edu.ucuenca.pagina_asos.uimanager;

import ec.edu.ucuenca.pagina_asos.controller.GenericController;
import ec.edu.ucuenca.pagina_asos.entity.Categoria;
import ec.edu.ucuenca.pagina_asos.entity.Escuela;
import ec.edu.ucuenca.pagina_asos.entity.Libro;
import ec.edu.ucuenca.pagina_asos.uimanager.util.JsfUtil;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.el.ELContext;
import javax.el.ValueExpression;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.imageio.ImageIO;
import javax.servlet.ServletContext;
import org.apache.commons.lang3.RandomStringUtils;
import org.primefaces.event.FileUploadEvent;

/**
 *
 * @author wilo
 */
@ManagedBean(name="GestorMaterial")
@SessionScoped
public class GestorMaterial implements Serializable {

    /**
     * Creates a new instance of MaterialBean
     */
    
    public static GestorMaterial getInstance() {
        ELContext context = FacesContext.getCurrentInstance().getELContext();
        ValueExpression ex = FacesContext.getCurrentInstance().getApplication().getExpressionFactory().
                createValueExpression(context, "#{GestorMaterial}", GestorMaterial.class);
        return (GestorMaterial) ex.getValue(context);
    }
    
    private String proceso;
    GenericController controller=new GenericController();
    Escuela escuela=new Escuela();
    
    private List<Libro> listMaterial;  
    private Libro material;
    
    private Categoria calegoriaSeleccionada;
    private List<Categoria> categorias;
    
    InputStream archivo;
    private String ext;
    
    
    public GestorMaterial() {
    }
    
    @PostConstruct
    public void init() {
        System.out.println("Entra Material");
        material=new Libro();
        escuela=GestorUsuario.getInstance().getUsuarioActual().getPersona().getEscuela();
        cargarLista();
    }
    public void cargarLista() {
        listMaterial = controller.findWhere(new Libro(), escuela);
        categorias=controller.findWhere(new Categoria(), escuela);
    }
    public String guardar()
    {
        Date d = new Date();
        String nombre = d.getYear() + "" + d.getMonth() + "" + d.getDay() + d.getHours() + d.getMinutes() + d.getTime();
        material.setImagen(nombre + RandomStringUtils.randomAlphanumeric(10) + "." + ext);
        
        FacesContext facesContext = FacesContext.getCurrentInstance();

        ServletContext ss = (ServletContext) facesContext.getExternalContext().getContext();
        String p = ss.getRealPath("/resources/imagenesSubidas/material/");
        copyFile(p, material.getImagen(), archivo);
        JsfUtil.addSuccessMessage("Material Alacenado correctamente");
        
        material.setCategoria(calegoriaSeleccionada);
        if (proceso.compareTo("actualizar")==0)
        {
            try {
                
                controller.edit(material);
                return "FrmMateriales.xhtml";
            } catch (Exception ex) {
                //Logger.getLogger(GestorMaterial2.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        else
        {
            java.util.Date utilDate = new java.util.Date(); //fecha actual
            long lnMilisegundos = utilDate.getTime();
            java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(lnMilisegundos);
                
            material.setFechaPublicacion(sqlTimestamp);
            material.setEscuela(escuela);
            
            controller.create(material);
           cargarLista();
            return "FrmMateriales.xhtml";
        }
        return "";
    }
     public String editar(Libro libro){
        
        int as=0;
        material=new Libro();
        material=libro;
        proceso = "actualizar";
        
        return "FrmCrearMaterial";
    }
     public String eliminar (Libro libro)
     {
         material=new Libro();
         material=libro;
         controller.destroy(material, material.getId());
         return "FrmMateriales.xhtml";
     }
     public String cancelar ()
     {
         return "FrmMateriales.xhtml";
     }

    public InputStream getArchivo() {
        return archivo;
    }

    public void setArchivo(InputStream archivo) {
        this.archivo = archivo;
    }

    public String getExt() {
        return ext;
    }

    public void setExt(String ext) {
        this.ext = ext;
    }
     
    public String getProceso() {
        return proceso;
    }

    public void setProceso(String proceso) {
        //categorias=controller.findWhere(new Categoria(), escuela);
        this.proceso = proceso;
    }

    public Escuela getEscuela() {
        return escuela;
    }

    public void setEscuela(Escuela escuela) {
        this.escuela = escuela;
    }

    public List<Libro> getListMaterial() {
        return listMaterial;
    }

    public void setListMaterial(List<Libro> listMaterial) {
        this.listMaterial = listMaterial;
    }

    public Libro getMaterial() {
        //System.out.println("Reco materiao");
        return material;
    }

    public void setMaterial(Libro material) {
        categorias=controller.findWhere(new Categoria(), escuela);
        this.material = material;
    }

    public Categoria getCalegoriaSeleccionada() {
        return calegoriaSeleccionada;
    }

    public void setCalegoriaSeleccionada(Categoria calegoriaSeleccionada) {
        this.calegoriaSeleccionada = calegoriaSeleccionada;
    }

    public List<Categoria> getCategorias() {
        return categorias;
    }

    public void setCategorias(List<Categoria> categorias) {
        this.categorias = categorias;
    }
     
    public void handleFileUpload(FileUploadEvent event) {  
        FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");  
        FacesContext.getCurrentInstance().addMessage(null, msg);  
    }
    
    public void upload(FileUploadEvent event) {
            FacesMessage msg = new FacesMessage("Success! ", event.getFile().getFileName() + " is uploaded.");  
            FacesContext.getCurrentInstance().addMessage(null, msg);
            try {
                setArchivo(event.getFile().getInputstream());
                ext = event.getFile().getFileName().substring(event.getFile().getFileName().length() - 3);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    public void copyFile(String destino, String fileName, InputStream in) {
        destino = destino + "/";
        try {   
            OutputStream out = new FileOutputStream(new File(destino + fileName));
            ImageIO.write(resize(in), "jpg", new File(destino + fileName));
            this.material.setImagen(fileName);
            int read = 0;
            byte[] bytes = new byte[1024];

            while ((read = in.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            in.close();
            out.flush();
            out.close();
            
            System.out.println("New file created! " + destino + fileName);    
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

    private BufferedImage resize(InputStream in) throws IOException {
        BufferedImage originalImage = ImageIO.read(in);
        int h = originalImage.getHeight();
        int w = originalImage.getWidth();
        int nuevoAncho = (w * 600) / h;
        int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType();
        if (h > 600 || w > 800) {
            BufferedImage resizeImageJpg = resizeImage(originalImage, type, nuevoAncho);
            return resizeImageJpg;
        } else {
            return originalImage;
        }
    }

    private static BufferedImage resizeImage(BufferedImage originalImage, int type, int ancho) {
        BufferedImage resizedImage = new BufferedImage(ancho, 600, type);
        Graphics2D g = resizedImage.createGraphics();
        g.drawImage(originalImage, 0, 0, ancho, 600, null);
        g.dispose();

        return resizedImage;
    }
    public void addError(ActionEvent actionEvent) {  
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Sample error message", "PrimeFaces makes no mistakes"));  
    }  
  
    public void addFatal(ActionEvent actionEvent) {  
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL,"Sample fatal message", "Fatal Error in System"));  
    }
}
